
/*
一个经典例子「计数器的困境」，假设你想统计一些数值，且该计数器在所有函数中都是可用的。
你可以定义一个全局变量 counter 当做计数器，再定义一个 add() 函数来设置计数器递增。代码如下：
 */
var counter = 0;
function add() {
    return counter += 1;
}

console.log(add()); // 1
console.log(add()); // 2
console.log(add()); // 3

// 页面上的任何脚本都能改变计数器 counter，即便没有调用 add() 函数。
// 可以使用闭包解决这个问题

// 在 add() 函数内部，再定义一个 plus() 内嵌函数（闭包），
// 内嵌函数 plus() 可以访问父函数的 counter 变量。
// 只要我们能在外部访问 plus() 函数，并且确保 counter = 0 只执行一次，就能解决计数器的困境
// 代码如下：
var add = function() {
    var counter = 0;
    var plus = function() {return counter += 1;}
    return plus;
}

// 计数器 counter 受 add() 函数的作用域保护，只能通过 puls2 方法修改。
var puls2 = add();
console.log(puls2());  // 1
console.log(puls2()); // 2
console.log(puls2()); // 3